package com.beauty.order.repository;

import com.beauty.order.entity.Order;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 订单数据访问层
 * 提供订单相关的数据库操作功能，包括基本的CRUD和自定义查询
 * 继承JpaRepository获取基础CRUD功能，继承JpaSpecificationExecutor支持复杂条件查询
 */
@Repository
public interface OrderRepository extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
    
    /**
     * 根据订单号查询订单
     * @param orderNumber 订单号
     * @return 订单信息（可能为空）
     */
    Optional<Order> findByOrderNumber(String orderNumber);
    
    /**
     * 查询指定客户的所有订单
     * @param customerId 客户ID
     * @return 订单列表
     */
    List<Order> findByCustomerId(String customerId);
    
    /**
     * 根据订单状态查询订单
     * @param status 订单状态
     * @return 符合状态的订单列表
     */
    List<Order> findByStatus(Order.OrderStatus status);
    
    /**
     * 查询指定时间范围内的订单
     * @param start 开始时间
     * @param end 结束时间
     * @return 时间范围内的订单列表
     */
    List<Order> findByOrderDateBetween(LocalDateTime start, LocalDateTime end);
    
    /**
     * 查询指定客户的特定状态订单
     * @param customerId 客户ID
     * @param status 订单状态
     * @return 符合条件的订单列表
     */
    List<Order> findByCustomerIdAndStatus(String customerId, Order.OrderStatus status);
    
    /**
     * 分页查询所有订单
     * @param pageable 分页参数
     * @return 分页订单结果
     */
    Page<Order> findAll(Pageable pageable);
    
    /**
     * 分页查询指定客户的订单
     * @param customerId 客户ID
     * @param pageable 分页参数
     * @return 分页订单结果
     */
    Page<Order> findByCustomerId(String customerId, Pageable pageable);
    
    /**
     * 分页查询指定状态的订单
     * @param status 订单状态
     * @param pageable 分页参数
     * @return 分页订单结果
     */
    Page<Order> findByStatus(Order.OrderStatus status, Pageable pageable);
    
    /**
     * 分页查询指定时间范围内的订单
     * @param start 开始时间
     * @param end 结束时间
     * @param pageable 分页参数
     * @return 分页订单结果
     */
    Page<Order> findByOrderDateBetween(LocalDateTime start, LocalDateTime end, Pageable pageable);
    
    /**
     * 以下方法用于按不同字段进行模糊搜索（分页）
     */
    // 按订单号模糊搜索
    Page<Order> findByOrderNumberContaining(String keyword, Pageable pageable);
    // 按客户ID模糊搜索
    Page<Order> findByCustomerIdContaining(String keyword, Pageable pageable);
    // 按物流单号模糊搜索
    Page<Order> findByTrackingNumberContaining(String keyword, Pageable pageable);
    // 按备注模糊搜索
    Page<Order> findByNotesContaining(String keyword, Pageable pageable);
    // 按收货地址模糊搜索
    Page<Order> findByShippingAddressContaining(String keyword, Pageable pageable);
    
    /**
     * 综合关键字搜索
     * 同时在订单号、客户ID、物流单号、备注和收货地址字段中进行模糊匹配
     * @param keyword 搜索关键字
     * @param pageable 分页参数
     * @return 分页搜索结果
     */
    @Query("SELECT o FROM Order o WHERE " +
           "LOWER(o.orderNumber) LIKE LOWER(CONCAT('%', ?1, '%')) OR " +
           "LOWER(o.customerId) LIKE LOWER(CONCAT('%', ?1, '%')) OR " +
           "LOWER(o.trackingNumber) LIKE LOWER(CONCAT('%', ?1, '%')) OR " +
           "LOWER(o.notes) LIKE LOWER(CONCAT('%', ?1, '%')) OR " +
           "LOWER(o.shippingAddress) LIKE LOWER(CONCAT('%', ?1, '%'))")
    Page<Order> searchByKeyword(String keyword, Pageable pageable);
} 